package org.mil.util;


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class FileSystemUtil {

	public static byte[] convertFileToByteArr(File source) {
		FileInputStream fin;
		byte[] arr = null;
		try {
			fin = new FileInputStream(source);
			arr = new byte[(int) source.length()];
			fin.read(arr);

		} catch (FileNotFoundException fnfe) {
			fnfe.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return arr;
	}


	
	/**
	 * 本方法是向指定的文件（若不存在则新建）写数据的预备操作
	 * 封装了一些常见的错误和异常。
	 * 写文件结束时只需getWriter("xxx").close()即可
	 * @param fileUrl 文件路径
	 * @return 一个BufferedWriter
	 * @throws IOException 
	 */
	public static BufferedWriter getWriter(String fileUrl) throws IOException{
		 File exf = new File(fileUrl);
	       if (exf.exists()|| exf.isDirectory()) 
	        ;//System.out.println("文件存在");
	       else 	        
	        try {
				exf.createNewFile();								 
			} catch (IOException e) {
				System.out.println("文件创建失败！");
				e.printStackTrace();
			}	       
			return  new BufferedWriter(new FileWriter(exf));		
		
	}
	
	public static BufferedReader getReader(String fileUrl) throws IOException{
		

		 File exf = new File(fileUrl);
	       if (!exf.exists()|| exf.isDirectory()) {
	        System.out.println("文件不存在，或是一个目录！");
	        return null;
	       }
	       
	       return new BufferedReader(new FileReader(exf));      
			 
		
	}
	
	public static List<String> readEveryLineOfFile(String urlFile){
		
		try {
			BufferedReader reader=FileSystemUtil.getReader(urlFile);
			List<String> lines=new LinkedList<String>();
			String temp=reader.readLine();
			while (temp!=null){
				lines.add(temp);				
				temp=reader.readLine();			
			}
			return lines;
			
		} catch (IOException e) {			
			e.printStackTrace();
			return null;
		}
		
		
	}
	
	/**
	 * 获得指定文件夹下的所有子文件夹列表
	 * @param dirPath 所指定的目录路径
	 * @return 
	 */
	public static List<File> getAllSubDirectories(String dirPath) {
		File rootDir = new File(dirPath);
		if (!rootDir.exists())
			return null;
		List<File> files = new ArrayList<File>();
		for (File f : rootDir.listFiles())
			if (f.isDirectory())
				files.add(f);
		return files;

	}
	/**
	 * 获得指定文件夹下的所有文件列表
	 * @param dirPath 所指定的目录路径
	 * @param containSubdir 是否包含子目录
	 * @return
	 */
	public static List<File> getAllFiles(String dirPath, boolean containSubdir) {
		File rootDir = new File(dirPath);
		if (!rootDir.exists())
			return null;
		if (containSubdir == false) {
			List<File> files = new ArrayList<File>();
			for (File f : rootDir.listFiles())
				if (!f.isDirectory())
					files.add(f);
			return files;
		}
		return listAllFiles(rootDir);
	}

	/**
	 * 递归法列出指定目录下的所有文件，包括子文件夹
	 * 
	 * @param directory  所指定的目录
	 * @return
	 */
	private static List<File> listAllFiles(File directory) {
		if (directory == null || !directory.isDirectory())
			return null;
		List<File> files = new ArrayList<File>();

		for (File f : directory.listFiles())
			if (f.isDirectory())
				files.addAll(listAllFiles(f));
			else
				files.add(f);
		return files;

	}

	public static void main(String[] args) {

		long a = System.currentTimeMillis();
		// List<File> l=getAllFiles("d:\\sys",false);
		List<File> l = getAllSubDirectories("d:\\sys");
		for (File f : l)
			System.out.println(f.getAbsolutePath());
		System.out.println(System.currentTimeMillis() - a);

		System.out.println("total=" + l.size());
		File f=new File("d:\\hash.exe");
		byte[] b=convertFileToByteArr(f);
		System.out.println("len=" +b.length);
		System.out.println(MessageDigestUtil.calcSHA1String(b));
		
	}
}